<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
	<TITLE>Дисциплина</TITLE>
	<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.3  (Linux)">
	<META NAME="AUTHOR" CONTENT="Sveta">
	<META NAME="CREATED" CONTENT="20070629;16220000">
	<META NAME="CHANGED" CONTENT="20080616;1484700">
	<STYLE TYPE="text/css">
	<!--
		@page { size: 8.27in 11.69in; margin-left: 0.41in; margin-right: 0.59in; margin-top: 0.79in; margin-bottom: 0.49in }
		@page:first { margin-left: 1.18in; margin-right: 0.59in; margin-top: 0.79in; margin-bottom: 0.79in }
		H1 { text-indent: 0.49in; margin-top: 0.19in; margin-bottom: 0.19in; background: #ffcc99; direction: ltr; color: #03329e; text-align: justify; widows: 2; orphans: 2; page-break-before: always }
		H1.western { font-family: "Verdana", sans-serif; font-size: 16pt; so-language: ru-RU }
		H1.cjk { font-family: "Times New Roman", serif; font-size: 16pt }
		H1.ctl { font-family: "Times New Roman", serif; font-size: 16pt; so-language: ar-SA }
		P { text-indent: 0.49in; margin-top: 0.08in; margin-bottom: 0.08in; direction: ltr; color: #000000; text-align: justify; widows: 2; orphans: 2 }
		P.western { font-family: "Times New Roman", serif; font-size: 12pt; so-language: ru-RU }
		P.cjk { font-family: "Times New Roman", serif; font-size: 12pt }
		P.ctl { font-family: "Times New Roman", serif; font-size: 12pt; so-language: ar-SA }
		H2 { text-indent: 0.49in; margin-top: 0.19in; margin-bottom: 0.19in; direction: ltr; color: #03329e; text-align: justify; widows: 2; orphans: 2; page-break-before: auto; page-break-after: auto }
		H2.western { font-family: "Verdana", sans-serif; font-size: 14pt; so-language: ru-RU }
		H2.cjk { font-family: "Times New Roman", serif; font-size: 14pt }
		H2.ctl { font-family: "Times New Roman", serif; font-size: 14pt; so-language: ar-SA }
		H3 { text-indent: 0.49in; margin-bottom: 0.04in; direction: ltr; color: #000000; text-align: justify; widows: 2; orphans: 2 }
		H3.western { font-family: "Arial", sans-serif; font-size: 13pt; so-language: ru-RU }
		H3.cjk { font-family: "Times New Roman", serif; font-size: 13pt }
		H3.ctl { font-family: "Arial", sans-serif; font-size: 13pt; so-language: ar-SA }
		PRE { color: #000000 }
		A:link { color: #0000ee }
		A:visited { color: #800080 }
	-->
	</STYLE>
</HEAD>
<BODY LANG="en-US" TEXT="#000000" LINK="#0000ee" VLINK="#800080" DIR="LTR">
<H1 LANG="ru-RU" CLASS="western">Начел</H1>
<H2 LANG="ru-RU" CLASS="western">Основы технологии
Jini</H2>
<P LANG="ru-RU" CLASS="western">Традиционно, операционные
системы разрабатываются исходя из
предположения, что у компьютера есть
процессор, память и диск. Когда вы
загружаете компьютер, первым делом он
ищет диск. Если он не находит диск, он
не может функционировать как компьютер.
Но в последнее время все чаще используется
другой подход. Встраиваемые устройства
имеют процессор, память и соединение с
сетью, но не имеют диска. Первым делом
мобильный телефон ищет телефонную сеть.
Если он не находит её, он не может
функционировать как телефон. Изменение
ориентации с диско-ориентированных на
сеть-ориентированные устройства влияет
и на программное обеспечение. Вот тут-то
и пригождается Jini.</P>
<P LANG="ru-RU" CLASS="western">Jini — попытка переосмыслить
архитектуру компьютера, исходя из
возрастающей важности сети и увеличения
количества бездисковых устройств. Эти
устройства, произведенные разными
компаниями, должны взаимодействовать
через сеть. Сеть сама по себе очень
динамична — устройства и сервисы
регулярно добавляются и удаляются. Jini
предоставляет механизм, позволяющий с
легкостью добавлять, удалять и искать
устройства и сервисы в сети. В добавок
к этому Jini предоставляет программную
модель, которая упрощает работу
программиста по организации взаимодействия
между устройствами.</P>
<P LANG="ru-RU" CLASS="western">Разработанная с
использованием Java, сериализации и RMI,
которые позволяют передавать объекты
по сете от виртуальной машины к виртуальной
машине, Jini пытается использовать
преимущества объектно-ориентированного
программирования в организации сетевого
взаимодействия. Вместо того, чтобы
требовать от производителей стандартизации
сетевых протоколов, с помощью которых
взаимодействуют устройства, Jini позволяет
устройствам общаться друг с другом
посредством объектных интерфейсов.</P>
<H2 LANG="ru-RU" CLASS="western">Архитектура Jini</H2>
<P LANG="ru-RU" CLASS="western">Jini — это набор API и
сетевых протоколов, которые помогают
создавать и внедрять распределенные
системы, организованные как федерация
сервисов. Сервисом может быть что угодно,
что доступно через сеть, и способно
выполнять какую-нибудь полезную (или
бесполезную) функцию. Аппаратные
устройства, программное обеспечение,
коммуникационные каналы и даже сами
пользователи могут быть сервисами.
Например, поддерживающий Jini диск может
предоставлять сервис &laquo;хранилище&raquo;.
Поддерживающий Jini принтер может
предоставлять сервис &laquo;печать&raquo;.
Федерация сервисов — это набор сервисов,
доступных в сети в текущий момент
времени, которые клиент (программа,
другой сервис или пользователь) может
объединить для достижения какой-либо
цели.</P>
<P LANG="ru-RU" CLASS="western">Чтобы выполнить свою
задачу, клиент использует сервисы.
Например, клиентская программа может
скачивать картинки из сервиса хранилища
изображений в цифровой камере, загружать
их в сервис хранилища, предоставляемый
жестким диском, и пересылать страницу
с уменьшенными копиями изображений на
сервис печати. В этом случае клиентская
программа создает распределенную
систему, состоящую из себя самой, сервиса
хранилища изображений, сервиса хранилища
файлов и сервиса печати. Клиент и сервисы
этой распределенной системы работают
вместе, чтобы выполнить общую задачу —
перенести изображения на жесткий диск
и распечатать уменьшенные копии.</P>
<P LANG="ru-RU" CLASS="western">Под словом &laquo;федерация&raquo;
подразумевается то, что Jini не предполагает
централизованного управления в сети.
Так как ни один сервис нельзя назвать
главным, набор всех сервисов доступен
через сеть как федерация — сгруппированный
набор равнозначных сущностей. Вместо
централизованного управления,
инфраструктура Jini предоставляет способ
находить друг друга клиентам и сервисам
(с помощью поискового сервиса, который
хранит список всех доступных на данный
момент сервисов). После того как сервис
и клиент обнаружили друг друга, они
взаимодействуют сами по себе. Клиент и
используемые им сервисы выполняют
задачи независимо от инфраструктуры
Jini. Если поисковый сервис Jini выходит из
строя, распределенная система, собранная
с его помощью, может продолжать работу.
Также Jini включает в себя сетевой протокол,
позволяющий клиентам находить сервисы
даже в отсутствии поискового сервиса.</P>
<H2 LANG="ru-RU" CLASS="western">Функционирование
Jini</H2>
<P LANG="ru-RU" CLASS="western">Jini определяет
инфраструктуру выполнения, которая
располагается в сети, и предоставляет
механизмы, позволяющие добавлять,
удалять, искать и получать доступ к
сервисам. Инфраструктура выполнения
делится на три части: поисковые сервисы,
поставщики сервисов и клиенты сервисов.
Поисковые сервисы — основной
организационный механизм в основанных
на Jini системах. Когда новый сервис
становится доступным в сети, он
регистрирует себя в поисковом сервисе.
Когда клиент хочет найти сервис, который
поможет ему в выполнении какой-либо
задачи, он обращается к поисковому
сервису.</P>
<P LANG="ru-RU" CLASS="western">Инфраструктура
выполнения использует один протокол
сетевого уровня, называющийся &laquo;обнаружение&raquo;
(discovery), и два протокола объектного
уровня, называющихся &laquo;присоединение&raquo;
(join) и &laquo;поиск&raquo; (lookup). Обнаружение
позволяет клиентам и сервисам найти
поисковые сервисы. Присоединение
позволяет сервису зарегистрировать
себя в поисковом сервисе. Поиск позволяет
клиенту запросить у поискового сервиса
те сервисы, которые могут помочь ему в
выполнении своей задачи.</P>
<H3 LANG="ru-RU" CLASS="western">Обнаружение</H3>
<P LANG="ru-RU" CLASS="western">Обнаружение работает
следующим образом: представьте, что у
вас есть жесткий диск, поддерживающий
Jini, который предоставляет сервис
хранилища. Как только вы подключаете
диск к сети, он рассылает уведомление
о своем присутствии с помощью
широковещательной отправки пакета
через определенный порт. В этот пакет
включены данные об IP-адресе и порте,
через которые поисковый сервис может
связаться с диском.</P>
<P LANG="ru-RU" CLASS="western">Поисковый сервис
отслеживает определенный порт и ждет
уведомления о присутствии. Как только
он получает такое уведомление, он
распаковывает и анализирует его. В нем,
как правило, содержится информация о
том, должен ли он соединиться с отправителем
пакета. Если да, то он соединяется с ним
напрямую через TCP соединение по IP адресу
и порту, указанному в пакете. Используя
RMI, поисковый сервис посылает через сеть
объект, называющийся регистратором
сервисов. Задача этого объекта —
дальнейшее взаимодействие с поисковым
сервисом. Вызывая методы этого объекта,
отправитель уведомления о присутствии
может выполнить присоединение или поиск
с помощью поискового сервиса. В случае
диска, поисковый сервис создает TCP
соединение с диском и посылает туда
регистратор сервисов, с помощью которого
диск регистрирует себя как хранилище,
вызвав метод присоединения.</P>
<H3 LANG="ru-RU" CLASS="western">Присоединение</H3>
<P LANG="ru-RU" CLASS="western">Как только поставщик
сервиса получил объект-регистратор
сервисов, результат обнаружения, он
готов присоединиться — стать частью
федерации сервисов, зарегистрированных
в поисковом сервисе. Для этого поставщик
сервиса вызывает метод register() у
объекта-регистратора сервисов, передавая
в качестве параметра объект, называемый
элементом сервиса — набор объектов,
характеризующих сервис. Метод register()
пересылает копию элемента сервиса
поисковому сервису, где этот объект
сохраняется. После этого поставщик
сервиса завершает процесс присоединения,
и его сервис оказывается зарегистрированным
в поисковом сервисе.</P>
<P LANG="ru-RU" CLASS="western">Элемент сервиса — это
контейнер для нескольких объектов,
включающий в себя объект, называемый
объектом сервиса, который клиенты могут
использовать для взаимодействия с
сервисом. Также элемент сервиса включает
в себя ряд атрибутов, которые могут быть
произвольными объектами. Например, это
могут быть иконки, классы, которые
предоставляют графический пользовательский
интерфейс к сервису и объекты, и объекты,
хранящие дополнительную информацию о
сервисе.</P>
<P LANG="ru-RU" CLASS="western">Объекты сервиса обычно
реализуют один или несколько интерфейсов,
через которые клиент может взаимодействовать
с сервисом. Например, поисковый сервис
— это Jini сервис, и его объект сервиса —
это регистратор сервисов. Метод
register(), вызываемый поставщиком сервисов
во время процесса присоединения, объявлен
в ServiceRegitrar интерфейсе (чать пакета
net.jini.core.lookup), который реализуют все
регистраторы сервисов. Клиенты и сервисы
взаимодействуют с поисковым сервисом
через регистратор сервисов, вызывая
методы, декларированные в интерфейсе
ServiceRegistrar. А жесткий диск будет
предоставляеть объект сервиса, реализующий
какой-нибудь стандартный интерфейс
сервиса хранилища. Клиенты будут искать
и взаимодействовать с диском через этот
интерфейс сервиса хранилища.</P>
<H3 LANG="ru-RU" CLASS="western">Поиск</H3>
<P LANG="ru-RU" CLASS="western">Как только сервис
зарегистрирован в поисковом сервисе с
помощью процесса присоединения, сервис
становится доступным для клиентов,
которые запрашивают поисковый сервис.
Чтобы построить распределенную систему
сервисов, которая будет работать вместе
и выполнять какую-либо задачу, клиент
должен найти отдельный сервисы и
воспользоваться их возможностями. Чтобы
найти сервис, клиент запрашивает
поисковый сервис с помощью процесса,
называемого поиском.</P>
<P LANG="ru-RU" CLASS="western">Чтобы выполнить поиск,
клиент вызывает метод lookup() у регистратора
сервисов (клиент, как и поставщик
сервисов, получает его с помощью процесса
обнаружения). Клиент передает шаблон
сервиса в качестве аргумента метода
lookup(). Это объект, являющийся критерием
поиска. Шаблон сервиса может содержать
ссылку на массив объектов типа Class. Эти
объекты позволяют поисковому сервису
понять, какой Java-тип (или типы) объекта
сервиса необходим клиенту. Также шаблон
сервиса может включать идентификатор
сервиса, который однозначно определяет
сервис и атрибуты, которые должны точно
совпадать с атрибутами в элементе
сервиса, предоставленном поставщиком
сервисов. Еще шаблон сервиса может
включать универсальные версии любого
из этих полей. Например, универсальный
идентификатор сервиса будет соответствовать
любому идентификатору сервиса. Метод
lookup() посылает шаблон сервиса поисковому
сервису, который производит запрос и
возвращает некоторое количество
подходящих объектов сервиса. 
</P>
<P LANG="ru-RU" CLASS="western">В общем случае, клиент
ищет сервис по Java-типу, как правило, по
интерфейсу. Например, если клиенту
необходим принтер, он составит шаблон
сервиса, который включает в себя
Class-объект для стандартного интерфейса
сервиса печати. Все сервисы печати
должны реализовывать этот интерфейс.
Поисковый сервис возвратит объект
сервиса (или несколько подходящих
объектов), которые реализуют этот
интерфейс. Атрибуты могут быть включены
в шаблон сервиса, чтобы сузить диапазон
поиска. Клиент может использовать сервис
печати, вызывая методы объекта сервиса,
декларированные в стандартном интерфейсе
сервиса печати.</P>
<H2 LANG="ru-RU" CLASS="western">Разделение интерфейса
и реализации</H2>
<P LANG="ru-RU" CLASS="western">Архитектура Jini позволяет
использовать объектно-ориентированное
программирование для организации
сетевого взаимодействия и получить
одно из ключевых его преимуществ —
разделение интерфейса и реализации.
Например, объект сервиса может
предоставлять клиентам доступ к сервису
множеством различных способов. Объект
может представлять собой сервис целиком,
который скачивается к клиенту во время
процедуры поиска и позднее запускается
локально. Кроме того, объект сервиса
может просто предоставлять интерфейс
для взаимодействия с удаленным сервером.
В этом случае, когда клиент вызывает
методы объекта сервиса, он через сеть
посылает запросы серверу, который на
самом деле делает всю работу. Локальный
объект сервиса и удаленный сервер также
могут работать совместно каждый над
своей частью задачи.</P>
<P LANG="ru-RU" CLASS="western">Важное следствие
архитектуры Jini — это то, что сетевой
протокол, используемый для взаимодействия
локального объекта сервиса и удаленного
сервера может быть неизвестен клиенту.
Как показано на рисунке снизу, сетевой
протокол — часть реализации сервиса.
<SPAN STYLE="font-weight: medium">Объект сервиса</SPAN>
может взаимодействовать с сервисом
через RMI, CORBA, DCOM, или любой другой протокол.
Клиенту просто не нужно беспокоиться
о сетевых протоколах, так как он
взаимодействует только с локальным
объектом сервиса, который реализовывает
какой-либо интерфейс. Объект сервиса
сам заботится о всем взаимодействии
через сеть.</P>
<P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in"><IMG SRC="artima_com_jini_jiniology_intro_html_1ca92eab.gif" NAME="Графический объект1" ALIGN=LEFT WIDTH=371 HEIGHT=152 BORDER=0><BR CLEAR=LEFT><BR>
</P>
<P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Различные
реализации одного и того же интерфейса
сервиса могут использовать абсолютно
разные подходы и различные сетевые
протоколы. Например, сервис может
использовать специализированное
аппаратное обеспечение, чтобы выполнить
запросы клиента, или он может использовать
программную реализацию для выполнения
тех же самых запросов. Более того,
реализация одного и того же сервиса
может изменяться с течением времени. И
клиент всегда может быть уверен, что
использует правильную версию объекта
сервиса, поскольку она предоставляется
поставщиком сервиса. Для клиента сервис
выглядит как известный интерфейс,
независимо от того, как он реализован
на самом деле.</P>
<H2 LANG="ru-RU" CLASS="western">Распределенное
программирование</H2>
<P LANG="ru-RU" CLASS="western">Модель распределенного
программирования Jini (Jini Distributed Programming)
расширяет стандартный набор механизмов
Java, позволяющих строить распределенные
системы. Модель распределенного
программирования Jini поддерживает
лизинг, распределенные транзакции и
распределенные события. 
</P>
<H3 LANG="ru-RU" CLASS="western">Лизинг</H3>
<P LANG="ru-RU" CLASS="western">Доступ к большинству
услуг в Jini-среде базируется на концепции
лизинга. В данном случае под лизингом
понимается гарантированный доступ к
услуге в течении определенного промежутка
времени. Лизинг в Jini аналогичен процессу
взятия напрокат машины. Когда кто-то
хочет взять машину напрокат, обсуждается
срок, на который данная машина берется.
Подобным образом в Jini объекты договариваются
друг с другом о лизинге. Например, когда
устройство использует процессы
обнаружения/присоединения при подключении
к сети, происходит его регистрация на
определенное выделенное время. До
истечения времени лизинга устройство
обязано вновь договориться о лизинге
или же договориться о прекращении
лизинга. Если устройство неожиданно
отключается от сети, то по истечении
срока лизинга устройство автоматически
удаляется из поискового сервиса. Таким
образом осуществляется &quot;распределенная
сборка мусора&quot;. 
</P>
<P LANG="ru-RU" CLASS="western">Лизинговое использование
ресурса может осуществляться в
привилегированном или непривилегированном
режиме. В привилегированном режиме
только одно устройство имеет доступ к
арендуемой услуге, в непривилегированном
режиме возможно многопользовательское
использование ресурсов.</P>
<H3 LANG="ru-RU" CLASS="western">Распределенная
обработка событий</H3>
<P LANG="ru-RU" CLASS="western">Сформировавшаяся
технология программирования на языке
Java в некоторых случаях предполагает
использование сообщений для взаимодействия
между объектами. Применяемая до сих пор
модель сообщений языка Java, разработанная
в рамках технологии JavaBeans, ориентирована
на решение задач взаимодействия объектов
в рамках одной виртуальной машины Java.
Механизм передачи таких локальных
сообщений существенно опирается на
предсказуемость поведения виртуальной
машины Java, на надежность исполняющего
программу аппаратного обеспечения. 
</P>
<P LANG="ru-RU" CLASS="western">Использование модели
сообщений остается полезным и при
создании распределенных приложений,
однако перенесение механизмов локальной
доставки сообщений на распределенные
системы не является тривиальным.
Распределенные системы не могут
гарантировать абсолютную надежность
каналов взаимодействия, поэтому при
создании распределенных приложений
должна учитываться возможность задержек
и потерь данных. Также должна учитываться
стоимость передачи информации между
узлами распределенной системы. Модель
распределенных сообщений предлагает
метод решения этих задач, расширяя
возможности стандартной модели сообщений:
</P>
<UL>
	<LI><P LANG="ru-RU" CLASS="western">распределенное
	сообщение несет служебную информацию
	о том, когда оно произошло относительно
	других событий; 
	</P>
	<LI><P LANG="ru-RU" CLASS="western">в компактной форме
	передается дополнительная информация,
	которую несет сообщение. 
	</P>
</UL>
<P LANG="ru-RU" CLASS="western">Модель распределенных
сообщений предлагает стратегию решения
задач надежной доставки, фильтрации,
маршрутизации сообщений. Таким образом
программный интерфейс Distributed Event API
позволяет стандартизовать методы
решения задачи пересылки сообщений с
учетом специфики распределенных систем.
</P>
<H3 LANG="ru-RU" CLASS="western">Поддержка распределенных
транзакций</H3>
<P LANG="ru-RU" CLASS="western">Для организации
управления транзакциями в Jini разработан
программный интерфейс Transactions API.
Архитектура реализованного механизма
диспетчеризации транзакций несколько
отличается от традиционной: программисты
получают минимальный набор средств,
необходимый для координирования действий
Java-объектов. Традиционные системы обычно
строго следят за состоянием всех
объектов, участвующих в транзакции,
например, в случае отката транзакции,
традиционный диспетчер позаботится о
модификации объектов для отката в
предыдущее состояние. Концепция, на
которую опирались разработчики Jini,
базируется на основах объектно-ориентированного
программирования: состояние объекта
может быть изменено только посредством
объявленных методов работы с этим
объектом, при этом объект следит за
консистентностью собственного состояния.
Диспетчер транзакций Jini лишь информирует
объекты о состоянии транзакции, но не
производит непосредственной модификации
объектов.</P>
<P LANG="ru-RU" CLASS="western">В основе же реализованного
механизма лежит традиционный двухфазовый
протокол. Если какой-то объект-участник
во время транзакции сообщает о том, что
событие, которое должно было произойти,
не произошло, то эта информация
отправляется диспетчеру транзакций.
При получении такого сообщения диспетчер
транзакций объявляет всем объектам-участникам
транзакции об откате в предыдущее
состояние. Если же все объекты успешно
выполнили свои части транзакции,
происходит фиксация транзакции. 
</P>
<P LANG="ru-RU" CLASS="western">Таким образом,
Transaction API реализует базовый механизм,
который может быть как угодно расширен
программистом.</P>
<H1 LANG="ru-RU" CLASS="western">Пример: копи-центр</H1>
<H2 LANG="ru-RU" CLASS="western">Обзор</H2>
<P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Итак,
мы завершили обзор архитектурных
особенностей <I>Jini</I>. Посмотрим теперь,
как реализуются базовые концепции этой
технологии на примере копи-центра.</P>
<P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Копи-центр
— это фирма, которая оказывает услуги
по копированию и печати фотографий с
носителя клиента.</P>
<P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Простой
копи-центр, реализованный в настоящем
примере, осуществляет две функции:</P>
<OL>
	<LI><P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Копирование
	всех фотографий с фотокамеры клиента
	на носитель клиента.</P>
	<LI><P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Печать
	всех фотографий с фотокамеры клиента.</P>
</OL>
<P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">В нашем
примере задействованы четыре <I>Jini</I>-сервиса:</P>
<OL>
	<LI><P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Сервис
	печати (драйвер принтера), единственной
	функцией которого является печать
	изображения. Интерфейс содержится в
	<I>PrintService.java</I>, а реализация — в
	<I>RealPrinterDriver.java</I>.</P>
	<LI><P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Сервис
	накопителя (драйвер флешки, винчестера,
	компакт-диска, и т.д.). Накопитель
	поддерживает две основные функции:
	прочитать файл с указанным именем и
	записать данные в указанный файл.
	Интерфейс содержится в файле
	<I>MassStorageDevice.java</I>, а реализация — в
	<I>HardDrive.java</I>.</P>
	<LI><P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Сервис
	камеры (драйвер камеры). Камера
	поддерживает три функции: получение
	списка уникальных имен фотографий,
	получение фотографии с указанным
	именем, а также удаление фотографии с
	указанным именем. Интерфейс содержится
	в файле <I>Camera.java</I>, а реализация — в
	файле <I>SimpleCamera.java</I>.</P>
	<LI><P LANG="ru-RU" CLASS="western" STYLE="margin-bottom: 0in">Сервис
	копи-центра. Копи-центр поддерживает
	две функции: копирование всех фотографий
	с фотокамеры на носитель и печать всех
	фотографий с фотокамеры. Интерфейс
	содержится в файле SynchronizationService.java, а
	реализация — в CopyCenter.java.</P>
	<OL>
		<H2 LANG="ru-RU" CLASS="western">Компиляция и запуск</H2>
	</OL>
</OL>
<P LANG="ru-RU" CLASS="western">Чтобы посмотреть, как
работает пример, нужно скомпилировать
пачку кода, запустить служебные программы,
а затем запустить наши сервисы, тем
самым невозбранно достигнув желаемого.</P>
<P LANG="ru-RU" CLASS="western">Компиляция осуществляется
следующими двумя командами:</P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>javac -classpath
&quot;.:jini-core.jar:jini-ext.jar:reggie.jar:reggie-dl.jar:tools.jar&quot;
*.java</FONT></P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>rmic CopyCenter
HardDrive RealPrinterDriver SimpleCamera</FONT></P>
<P LANG="ru-RU" CLASS="western">Предполагается, что
jar-файлы, поставляемые с <I>Jini 1.2</I> лежат
рядом с исходными текстами. Если это не
так, тогда требуется указать к ним полные
(относительные) пути.</P>
<P LANG="ru-RU" CLASS="western">Как только компиляция
и генерация заглушек для <I>RMI</I> завершена,
так сразу можно приступать к процессу
запуска копи-центра. Для начала, создадим
файл <I>policy.all</I> следующего содержаниея:</P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>grant {</FONT></P>
<P LANG="ru-RU" CLASS="western">    <FONT SIZE=2>permission
java.security.AllPermission;</FONT></P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>};</FONT></P>
<P LANG="ru-RU" CLASS="western">Этот файл используется
при запуска сервисов <I>Jini</I> и определяет
общую политику безопасности (в нашем
примере всем всё можно).</P>
<P LANG="ru-RU" CLASS="western">Перед выполнением
удалённого вызова, <I>Jini</I> копирует код
по сети с удалённой машины на локальную
и лишь затем его выполняет. Чтобы этот
механизм заработал, необходимо запустить
специальную программу:</P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>java -classpath
&quot;.:jini-core.jar:jini-ext.jar:reggie.jar:reggie-dl.jar:tools.jar&quot;
-jar tools.jar -port 8081 -dir . -verbose </FONT>
</P>
<P LANG="ru-RU" CLASS="western">Для правильного
функционирования подсистемы <I>RMI, </I><SPAN STYLE="font-style: normal">следует
запустить демон:</SPAN></P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>rmid
-J-Dsun.rmi.activation.execPolicy=none</FONT></P>
<P LANG="ru-RU" CLASS="western">Ключевой аспект
инфраструктуры <I>Jini</I> — сервисы поиска.
Мы будем использовать сервис поиска
<I>Reggie, </I><SPAN STYLE="font-style: normal">входящий в
комплект поставки </SPAN><I>Jini 1.2. </I><SPAN STYLE="font-style: normal">Чтобы
его запустить следует выполнить скрипт:</SPAN></P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2><SPAN STYLE="font-style: normal">rm
-rf ./reggie_log</SPAN></FONT></P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2><SPAN STYLE="font-style: normal">java
-jar -classpath
&quot;.:jini-core.jar:jini-ext.jar:reggie.jar:reggie-dl.jar:tools.jar&quot;
reggie.jar http://localhost:8081/reggie-dl.jar  policy.all reggie_log
public</SPAN></FONT></P>
<P LANG="ru-RU" CLASS="western">Теперь перейдем
непосредственно к запуску нашего кода.
Создадим файл <I>service.sh </I>следующего
содержания:</P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>java -classpath
&quot;.:jini-core.jar:jini-ext.jar:reggie.jar:reggie-dl.jar:tools.jar&quot;
-Djava.security.policy = policy.all $1</FONT></P>
<P LANG="ru-RU" CLASS="western">Запустим сервисы:</P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>sh service.sh HardDrive</FONT></P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>sh service.sh
RealPrinterDriver</FONT></P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>sh service.sh
SimpleCamera</FONT></P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>sh service.sh CopyCenter</FONT></P>
<P LANG="ru-RU" CLASS="western">А затем запустим
клиентскую программу:</P>
<P LANG="ru-RU" CLASS="western"><FONT SIZE=2>sh service.sh Client</FONT></P>
<OL>
	<OL>
		<OL START=0>
			<PRE STYLE="margin-top: 0.08in">  </PRE>
		</OL>
	</OL>
</OL>
<H2 LANG="ru-RU" CLASS="western">Приложение 1:
PrintService.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.Remote;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RemoteException;</FONT>

<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>interface</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>PrintService</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>extends</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Remote</B></FONT><FONT COLOR="#000000"> {</FONT>
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">printBitmap</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[] b) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">}</FONT></PRE><H2 LANG="ru-RU" CLASS="western">
Приложение 2: RealPrinterDriver.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.Remote;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RemoteException;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.server.UnicastRemoteObject;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RMISecurityManager;</FONT>

<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.lookup.entry.Name;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceRegistrar;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceItem;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.discovery.LookupLocator;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.entry.Entry;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lease.Lease;</FONT>

<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>class</B></FONT><FONT COLOR="#000000"> RealPrinterDriver </FONT><FONT COLOR="#000000"><B>extends</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>UnicastRemoteObject</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>implements</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>PrintService</B></FONT><FONT COLOR="#000000"> {</FONT>

<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">printBitmap</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[] b) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Printing job&quot;</FONT><FONT COLOR="#000000">);</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">RealPrinterDriver</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>super</B></FONT><FONT COLOR="#000000"> ();</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">main</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000">[] args) {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>try</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">setSecurityManager</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RMISecurityManager</B></FONT><FONT COLOR="#000000"> ());</FONT>
                        
<FONT COLOR="#000000">                        ServiceItem serviceItem = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">ServiceItem</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">, </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">RealPrinterDriver</FONT><FONT COLOR="#000000">(), </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                        LookupLocator lookup = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">LookupLocator</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#dd0000">&quot;jini://localhost&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        ServiceRegistrar registrar  = lookup.</FONT><FONT COLOR="#000080">getRegistrar</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        registrar.</FONT><FONT COLOR="#000080">register</FONT><FONT COLOR="#000000">(serviceItem, </FONT><FONT COLOR="#0095ff"><B>Lease</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">FOREVER</FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Printer online&quot;</FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>catch</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> e)</FONT>
                {
<FONT COLOR="#000000">                        e.</FONT><FONT COLOR="#000080">printStackTrace</FONT><FONT COLOR="#000000">();</FONT>
                }
        }

} </PRE><H2 LANG="ru-RU" CLASS="western">
Приложение 3: Camera.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.Remote;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RemoteException;</FONT>

<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>interface</B></FONT><FONT COLOR="#000000"> Camera </FONT><FONT COLOR="#000000"><B>extends</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Remote</B></FONT><FONT COLOR="#000000"> {</FONT>
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[]   </FONT><FONT COLOR="#000080">getImage</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000">[] </FONT><FONT COLOR="#000080">getImageNames</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">removeImage</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000">;</FONT>
        
<FONT COLOR="#000000">}</FONT></PRE><H2 LANG="ru-RU" CLASS="western">
Приложение 4: SimpleCamera.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.Remote;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RemoteException;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.server.UnicastRemoteObject;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RMISecurityManager;</FONT>

<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.lookup.entry.Name;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceRegistrar;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceItem;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.discovery.LookupLocator;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.entry.Entry;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lease.Lease;</FONT>

<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>class</B></FONT><FONT COLOR="#000000"> SimpleCamera </FONT><FONT COLOR="#000000"><B>extends</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>UnicastRemoteObject</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>implements</B></FONT><FONT COLOR="#000000"> Camera {</FONT>
                
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[]   </FONT><FONT COLOR="#000080">getImage</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Simple camera: get image: &quot;</FONT><FONT COLOR="#000000"> + name);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">;</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000">[] </FONT><FONT COLOR="#000080">getImageNames</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Simple camera: get image names&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000">[]{</FONT><FONT COLOR="#dd0000">&quot;photo&quot;</FONT><FONT COLOR="#000000">};</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">removeImage</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Simple camera: remove image: &quot;</FONT><FONT COLOR="#000000"> + name);</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">SimpleCamera</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>super</B></FONT><FONT COLOR="#000000"> ();</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">main</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000">[] args) {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>try</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">setSecurityManager</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RMISecurityManager</B></FONT><FONT COLOR="#000000"> ());</FONT>
                        
<FONT COLOR="#000000">                        ServiceItem serviceItem = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">ServiceItem</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">, </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">SimpleCamera</FONT><FONT COLOR="#000000">(), </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                        LookupLocator lookup = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">LookupLocator</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#dd0000">&quot;jini://localhost&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        ServiceRegistrar registrar  = lookup.</FONT><FONT COLOR="#000080">getRegistrar</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        registrar.</FONT><FONT COLOR="#000080">register</FONT><FONT COLOR="#000000">(serviceItem, </FONT><FONT COLOR="#0095ff"><B>Lease</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">FOREVER</FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Simple camera online&quot;</FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>catch</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> e)</FONT>
                {
<FONT COLOR="#000000">                        e.</FONT><FONT COLOR="#000080">printStackTrace</FONT><FONT COLOR="#000000">();</FONT>
                }
        }

<FONT COLOR="#000000">} </FONT></PRE><H2 LANG="ru-RU" CLASS="western">
Приложение 5: SynchronizationService.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.Remote;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RemoteException;</FONT>

<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>interface</B></FONT><FONT COLOR="#000000"> SynchronizeService </FONT><FONT COLOR="#000000"><B>extends</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Remote</B></FONT><FONT COLOR="#000000"> {</FONT>
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">download</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">print</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000">;</FONT>
        
<FONT COLOR="#000000">}</FONT></PRE><H2 LANG="ru-RU" CLASS="western">
Приложение 6: CopyCenter.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.Remote;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RemoteException;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.server.UnicastRemoteObject;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RMISecurityManager;</FONT>

<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.lookup.entry.Name;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceRegistrar;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceItem;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.discovery.LookupLocator;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.entry.Entry;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lease.Lease;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceTemplate;</FONT>


<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>class</B></FONT><FONT COLOR="#000000"> CopyCenter </FONT><FONT COLOR="#000000"><B>extends</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>UnicastRemoteObject</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>implements</B></FONT><FONT COLOR="#000000"> SynchronizeService {</FONT>

<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> MassStorageDevice </FONT><FONT COLOR="#000080">getDiscDevice</FONT><FONT COLOR="#000000">() {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>try</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        LookupLocator lookup = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">LookupLocator</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#dd0000">&quot;jini://localhost&quot;</FONT><FONT COLOR="#000000">);</FONT>
        
<FONT COLOR="#000000">                        ServiceRegistrar registrar  = lookup.</FONT><FONT COLOR="#000080">getRegistrar</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        ServiceTemplate template = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">ServiceTemplate</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">, </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Class</B></FONT><FONT COLOR="#000000">[] {MassStorageDevice.</FONT><FONT COLOR="#000080">class</FONT><FONT COLOR="#000000">}, </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">);</FONT>
                                
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> (MassStorageDevice) registrar.</FONT><FONT COLOR="#000080">lookup</FONT><FONT COLOR="#000000"> (template);</FONT>
<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>catch</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> e) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;No hard drives found, process aborted&quot;</FONT><FONT COLOR="#000000">);            </FONT>
<FONT COLOR="#000000">                        e.</FONT><FONT COLOR="#000080">printStackTrace</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">;</FONT>
                } 
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> Camera </FONT><FONT COLOR="#000080">getCameraDevice</FONT><FONT COLOR="#000000">() {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>try</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        LookupLocator lookup = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">LookupLocator</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#dd0000">&quot;jini://localhost&quot;</FONT><FONT COLOR="#000000">);</FONT>
        
<FONT COLOR="#000000">                        ServiceRegistrar registrar  = lookup.</FONT><FONT COLOR="#000080">getRegistrar</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        ServiceTemplate template = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">ServiceTemplate</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">, </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Class</B></FONT><FONT COLOR="#000000">[] {Camera.</FONT><FONT COLOR="#000080">class</FONT><FONT COLOR="#000000">}, </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">);</FONT>
                                
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> (Camera) registrar.</FONT><FONT COLOR="#000080">lookup</FONT><FONT COLOR="#000000"> (template);</FONT>
<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>catch</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> e) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;No cameras found, process aborted&quot;</FONT><FONT COLOR="#000000">);                </FONT>
<FONT COLOR="#000000">                        e.</FONT><FONT COLOR="#000080">printStackTrace</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">;</FONT>
                } 
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>PrintService</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">getPrinterDevice</FONT><FONT COLOR="#000000">() {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>try</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        LookupLocator lookup = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">LookupLocator</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#dd0000">&quot;jini://localhost&quot;</FONT><FONT COLOR="#000000">);</FONT>
        
<FONT COLOR="#000000">                        ServiceRegistrar registrar  = lookup.</FONT><FONT COLOR="#000080">getRegistrar</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        ServiceTemplate template = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">ServiceTemplate</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">, </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Class</B></FONT><FONT COLOR="#000000">[] {</FONT><FONT COLOR="#0095ff"><B>PrintService</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">class</FONT><FONT COLOR="#000000">}, </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">);</FONT>
                                
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>PrintService</B></FONT><FONT COLOR="#000000">) registrar.</FONT><FONT COLOR="#000080">lookup</FONT><FONT COLOR="#000000"> (template);</FONT>
<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>catch</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> e) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;No printers found, process aborted&quot;</FONT><FONT COLOR="#000000">);               </FONT>
<FONT COLOR="#000000">                        e.</FONT><FONT COLOR="#000080">printStackTrace</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">;</FONT>
                } 
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">download</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Ivoked download all photos process&quot;</FONT><FONT COLOR="#000000">);               </FONT>
<FONT COLOR="#000000">                MassStorageDevice hdd = </FONT><FONT COLOR="#000080">getDiscDevice</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                Camera cam = </FONT><FONT COLOR="#000080">getCameraDevice</FONT><FONT COLOR="#000000">();</FONT>
                
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>if</B></FONT><FONT COLOR="#000000"> (hdd == </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000"> || cam == </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Unable to download photos&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000">;</FONT>
                }
                
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>for</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name : cam.</FONT><FONT COLOR="#000080">getImageNames</FONT><FONT COLOR="#000000">()) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Downloading photo: &quot;</FONT><FONT COLOR="#000000"> + name);                       </FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[] bitmap = cam.</FONT><FONT COLOR="#000080">getImage</FONT><FONT COLOR="#000000">(name);</FONT>
<FONT COLOR="#000000">                        hdd.</FONT><FONT COLOR="#000080">writeFile</FONT><FONT COLOR="#000000">(name, bitmap);</FONT>
                }
                
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Done&quot;</FONT><FONT COLOR="#000000">);             </FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">print</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Ivoked download all photos process&quot;</FONT><FONT COLOR="#000000">);               </FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>PrintService</B></FONT><FONT COLOR="#000000"> printer = </FONT><FONT COLOR="#000080">getPrinterDevice</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                Camera cam = </FONT><FONT COLOR="#000080">getCameraDevice</FONT><FONT COLOR="#000000">();</FONT>
                        
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>if</B></FONT><FONT COLOR="#000000"> (cam == </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000"> || printer == </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Unable to print photos&quot;</FONT><FONT COLOR="#000000">);           </FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000">;</FONT>
                }
                 
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>for</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name : cam.</FONT><FONT COLOR="#000080">getImageNames</FONT><FONT COLOR="#000000">()) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Printing photo: &quot;</FONT><FONT COLOR="#000000"> + name);                  </FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[] bitmap = cam.</FONT><FONT COLOR="#000080">getImage</FONT><FONT COLOR="#000000">(name);</FONT>
<FONT COLOR="#000000">                        printer.</FONT><FONT COLOR="#000080">printBitmap</FONT><FONT COLOR="#000000">(bitmap);</FONT>
                }
                
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Done&quot;</FONT><FONT COLOR="#000000">);             </FONT>
                
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">CopyCenter</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>super</B></FONT><FONT COLOR="#000000"> ();</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">main</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000">[] args) {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>try</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">setSecurityManager</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RMISecurityManager</B></FONT><FONT COLOR="#000000"> ());</FONT>
                        
<FONT COLOR="#000000">                        ServiceItem serviceItem = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">ServiceItem</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">, </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">CopyCenter</FONT><FONT COLOR="#000000">(), </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                        LookupLocator lookup = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">LookupLocator</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#dd0000">&quot;jini://localhost&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        ServiceRegistrar registrar  = lookup.</FONT><FONT COLOR="#000080">getRegistrar</FONT><FONT COLOR="#000000">();</FONT>
                        
<FONT COLOR="#000000">                        registrar.</FONT><FONT COLOR="#000080">register</FONT><FONT COLOR="#000000">(serviceItem, </FONT><FONT COLOR="#0095ff"><B>Lease</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">FOREVER</FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Copy Center online&quot;</FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>catch</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> e)</FONT>
                {
<FONT COLOR="#000000">                        e.</FONT><FONT COLOR="#000080">printStackTrace</FONT><FONT COLOR="#000000">();</FONT>
                }
        }

} </PRE><P LANG="ru-RU" CLASS="western" STYLE="text-indent: 0in">
<BR><BR>
</P>
<H2 LANG="ru-RU" CLASS="western">Приложение 7:
MassStorageDevice.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.Remote;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RemoteException;</FONT>

<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>interface</B></FONT><FONT COLOR="#000000"> MassStorageDevice </FONT><FONT COLOR="#000000"><B>extends</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Remote</B></FONT><FONT COLOR="#000000"> {</FONT>
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[]   </FONT><FONT COLOR="#000080">readFile</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">writeFile</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name, </FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[] data) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000">;</FONT>
        
}</PRE><P LANG="ru-RU" CLASS="western" STYLE="text-indent: 0in">
<BR><BR>
</P>
<H2 LANG="ru-RU" CLASS="western">Приложение 8:
HardDrive.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.Remote;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RemoteException;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.server.UnicastRemoteObject;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RMISecurityManager;</FONT>

<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.lookup.entry.Name;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceRegistrar;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceItem;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.discovery.LookupLocator;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.entry.Entry;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lease.Lease;</FONT>

<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>class</B></FONT><FONT COLOR="#000000"> HardDrive </FONT><FONT COLOR="#000000"><B>extends</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>UnicastRemoteObject</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>implements</B></FONT><FONT COLOR="#000000"> MassStorageDevice {</FONT>

<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[]   </FONT><FONT COLOR="#000080">readFile</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;HDD: reading from file &lt;&quot;</FONT><FONT COLOR="#000000"> + name + </FONT><FONT COLOR="#dd0000">&quot;&gt;&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">;</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000">     </FONT><FONT COLOR="#000080">writeFile</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> name, </FONT><FONT COLOR="#800000">byte</FONT><FONT COLOR="#000000">[] data) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;HDD: writing to file &lt;&quot;</FONT><FONT COLOR="#000000"> + name + </FONT><FONT COLOR="#dd0000">&quot;&gt;&quot;</FONT><FONT COLOR="#000000">);</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">HardDrive</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RemoteException</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>super</B></FONT><FONT COLOR="#000000"> ();</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">main</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000">[] args) {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>try</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">setSecurityManager</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RMISecurityManager</B></FONT><FONT COLOR="#000000"> ());</FONT>
                        
<FONT COLOR="#000000">                        ServiceItem serviceItem = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">ServiceItem</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">, </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">HardDrive</FONT><FONT COLOR="#000000">(), </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                        LookupLocator lookup = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">LookupLocator</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#dd0000">&quot;jini://localhost&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        ServiceRegistrar registrar  = lookup.</FONT><FONT COLOR="#000080">getRegistrar</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        registrar.</FONT><FONT COLOR="#000080">register</FONT><FONT COLOR="#000000">(serviceItem, </FONT><FONT COLOR="#0095ff"><B>Lease</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">FOREVER</FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Hard Drive online&quot;</FONT><FONT COLOR="#000000">);</FONT>

<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>catch</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> e)</FONT>
                {
<FONT COLOR="#000000">                        e.</FONT><FONT COLOR="#000080">printStackTrace</FONT><FONT COLOR="#000000">();</FONT>
                }
        }

} </PRE><H2 LANG="ru-RU" CLASS="western">
Приложение 9: Client.java</H2>
<PRE><FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.entry.Entry;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.discovery.LookupLocator;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceRegistrar;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.core.lookup.ServiceTemplate;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> net.jini.lookup.entry.Name;</FONT>

<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.rmi.RMISecurityManager;</FONT>
<FONT COLOR="#000000"><B>import</B></FONT><FONT COLOR="#808000"> java.io.*;</FONT>

<FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>class</B></FONT><FONT COLOR="#000000"> Client {</FONT>
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> SynchronizeService </FONT><FONT COLOR="#000080">xxx_connect</FONT><FONT COLOR="#000000">() {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Looking for copy center...&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>try</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;System: setting security manager&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">setSecurityManager</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>RMISecurityManager</B></FONT><FONT COLOR="#000000"> ());</FONT>
        
<FONT COLOR="#000000">                        LookupLocator lookup = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">LookupLocator</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#dd0000">&quot;jini://localhost&quot;</FONT><FONT COLOR="#000000">);</FONT>
        
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;System: getting lookup registrar&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        ServiceRegistrar registrar  = lookup.</FONT><FONT COLOR="#000080">getRegistrar</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        ServiceTemplate template = </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">ServiceTemplate</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">, </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Class</B></FONT><FONT COLOR="#000000">[] {SynchronizeService.</FONT><FONT COLOR="#000080">class</FONT><FONT COLOR="#000000">}, </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">);</FONT>
                                
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;System: starting lookup!&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> (SynchronizeService) registrar.</FONT><FONT COLOR="#000080">lookup</FONT><FONT COLOR="#000000"> (template);</FONT>
<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>catch</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> e) {</FONT>
<FONT COLOR="#000000">                        e.</FONT><FONT COLOR="#000080">printStackTrace</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">;</FONT>
                } 
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">xxx_menu</FONT><FONT COLOR="#000000">() {</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;*****************************************************&quot;</FONT><FONT COLOR="#000000">);            </FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;*Synchronization service client by Antoshka &amp; Valerka*&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;*****************************************************&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Menu:&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;1. Print all photos&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;2. Copy all photos to disc&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;3. Bye&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">print</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Your choice: &quot;</FONT><FONT COLOR="#000000">);</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">xxx_1</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> java.</FONT><FONT COLOR="#000080">rmi</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">RemoteException</FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                SynchronizeService ss = </FONT><FONT COLOR="#000080">xxx_connect</FONT><FONT COLOR="#000000">();</FONT>
                
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>if</B></FONT><FONT COLOR="#000000"> (ss == </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Copy center not found, sorry&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>else</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Copy center found, processing request&quot;</FONT><FONT COLOR="#000000">);</FONT>
                } 
                
<FONT COLOR="#000000">                ss.</FONT><FONT COLOR="#000080">print</FONT><FONT COLOR="#000000">();</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">xxx_2</FONT><FONT COLOR="#000000">() </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> java.</FONT><FONT COLOR="#000080">rmi</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">RemoteException</FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                SynchronizeService ss = </FONT><FONT COLOR="#000080">xxx_connect</FONT><FONT COLOR="#000000">();</FONT>
                
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>if</B></FONT><FONT COLOR="#000000"> (ss == </FONT><FONT COLOR="#000000"><B>null</B></FONT><FONT COLOR="#000000">) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Copy center not found, sorry&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>return</B></FONT><FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">                } </FONT><FONT COLOR="#000000"><B>else</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Copy center found, processing request&quot;</FONT><FONT COLOR="#000000">);</FONT>
                } 
                
<FONT COLOR="#000000">                ss.</FONT><FONT COLOR="#000080">download</FONT><FONT COLOR="#000000">();</FONT>
        }
        
<FONT COLOR="#000000">        </FONT><FONT COLOR="#808080"><I>// а этот подшипник мы сделаем из дерева ибо до середины методички всё равно никто не дочитает</I></FONT>
<FONT COLOR="#000000">    </FONT><FONT COLOR="#000000"><B>public</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">static</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#800000">void</FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000080">main</FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000">[] args) </FONT><FONT COLOR="#000000"><B>throws</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>Exception</B></FONT><FONT COLOR="#000000"> { </FONT>
<FONT COLOR="#000000">                </FONT><FONT COLOR="#0095ff"><B>BufferedReader</B></FONT><FONT COLOR="#000000"> br =     </FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>BufferedReader</B></FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#000000"><B>new</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#0095ff"><B>InputStreamReader</B></FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">in</FONT><FONT COLOR="#000000">));</FONT>
                
<FONT COLOR="#000000">                </FONT><FONT COLOR="#000080">xxx_menu</FONT><FONT COLOR="#000000">();                     </FONT>

<FONT COLOR="#000000">                </FONT><FONT COLOR="#000000"><B>while</B></FONT><FONT COLOR="#000000"> (</FONT><FONT COLOR="#000000"><B>true</B></FONT><FONT COLOR="#000000">) {</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#0095ff"><B>String</B></FONT><FONT COLOR="#000000"> s = br.</FONT><FONT COLOR="#000080">readLine</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                        </FONT><FONT COLOR="#000000"><B>if</B></FONT><FONT COLOR="#000000"> (s.</FONT><FONT COLOR="#000080">equals</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;1&quot;</FONT><FONT COLOR="#000000">)) {</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;You have selected to print all photos from your camera, please wait&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#000080">xxx_1</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Done&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        } </FONT><FONT COLOR="#000000"><B>else</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>if</B></FONT><FONT COLOR="#000000"> (s.</FONT><FONT COLOR="#000080">equals</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;2&quot;</FONT><FONT COLOR="#000000">)) {</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;You have selected to copy all photos from your camera to disc&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#000080">xxx_2</FONT><FONT COLOR="#000000">();</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Done&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                        } </FONT><FONT COLOR="#000000"><B>else</B></FONT><FONT COLOR="#000000"> </FONT><FONT COLOR="#000000"><B>if</B></FONT><FONT COLOR="#000000"> (s.</FONT><FONT COLOR="#000080">equals</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;3&quot;</FONT><FONT COLOR="#000000">)){</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#0095ff"><B>System</B></FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">out</FONT><FONT COLOR="#000000">.</FONT><FONT COLOR="#000080">println</FONT><FONT COLOR="#000000">(</FONT><FONT COLOR="#dd0000">&quot;Good bye!&quot;</FONT><FONT COLOR="#000000">);</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#000000"><B>break</B></FONT><FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">                        } </FONT><FONT COLOR="#000000"><B>else</B></FONT><FONT COLOR="#000000"> {</FONT>
<FONT COLOR="#000000">                                </FONT><FONT COLOR="#000080">xxx_menu</FONT><FONT COLOR="#000000">();</FONT>
                        } 
                }
    }
}</PRE><P LANG="ru-RU" CLASS="western" STYLE="text-indent: 0in">
<BR><BR>
</P>
</BODY>
</HTML>